/************************ (C) COPYLEFT 2018 Merafour *************************
* File Name          : Ini.h
* Author             : Merafour
* Last Modified Date : 04/05/2020
* Description        : 配置文件解析.
********************************************************************************
* https://merafour.blog.163.com
* merafour@163.com
* https://github.com/merafour
******************************************************************************/
#ifndef __INI__
#define __INI__

#include <stdint.h>
//#include <stddef.h>
//#include <stdlib.h>
//#include <string.h>
//#include <assert.h>
//#include <errno.h>
//#include <ctype.h>
//#include <string.h>
//#include <memory.h>

#ifdef __cplusplus
extern "C" {
#endif

#define INI_FW_VER                      "0.1.0"
// 定义一条 Ini信息的最大长度
#ifndef INI_ITEM_LEN
#define INI_ITEM_LEN                    32
#endif

// 解析配置文件
/* ------------------------------------------------------- 读配置信息 ------------------------------------------------------------- */                                      // 黑名单
struct ini_Parse {
    char *const text;        // Ini格式数据缓存
    const int   tsize;       // Ini格式数据缓存大小
    int pos;                 // 当前文件指针位置
    int tlen;                // Ini格式数据内容长度
};
// 创建空模板
extern int ini_list_empty(struct ini_Parse* const Ini);
extern int ini_list_samples(struct ini_Parse* const Ini);
// 更新一项数据,不存在时则添加
extern int ini_update_item(struct ini_Parse* const Ini, const char AppName[], const char KeyName[], const char *__format, ...);
// 删除一项数据
extern int ini_del(struct ini_Parse* const Ini, const char AppName[], const char KeyName[]);
// 返回一个区间偏移量
extern int ini_get_section(struct ini_Parse* const Ini, const char AppName[], int* const _pos);
// 获取键值对的地址
extern int ini_get_section_key(struct ini_Parse* const Ini, const char AppName[], const char KeyName[], int* const _pos);
// 获取键值对的值
extern int ini_get_section_key_value(struct ini_Parse* const Ini, const char AppName[], const char KeyName[], char KeyVal[]);
// 获取缓存大小
static inline int ini_Size(const struct ini_Parse* const Ini){ return Ini->tlen;}
// 插入一项数据
extern int ini_del_item(struct ini_Parse* const Ini, const int seek);
extern int ini_print(struct ini_Parse* const Ini, const char *__format, ...);
extern int ini_get_field(struct ini_Parse* const Ini, const char section[], const char _key[], const char dft[], char _value[]);

/*********************************************************** Ini 数据操作 ************************************************************************/
extern int ini_get_int(struct ini_Parse* const Ini, const char section[], const char _key[], const int dft);
extern double ini_get_double(struct ini_Parse* const Ini, const char section[], const char _key[], const double dft);
extern int ini_get_hex(struct ini_Parse* const Ini, const char section[], const char _key[], const int dft);
/*   更新键值对   */
static inline int ini_update_int(struct ini_Parse* const Ini, const char section[], const char _key[], const int value)
{
    return ini_update_item(Ini, section, _key, "%d", value);
}
static inline int ini_update_double(struct ini_Parse* const Ini, const char section[], const char _key[], const double value)
{
    return ini_update_item(Ini, section, _key, "%f", value);
}

#ifdef __cplusplus
}
#endif

#endif  // __ini__
